﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


//printf() 的作⽤是将参数⽂本输出到屏幕。
//它名字⾥⾯的 f 代表 format （格式化），表⽰可以定制输出⽂本的格式。

//int main()
//{
//	printf("hello world!\n");
//
//	//在一行内可以换行
//	printf("abc\ndef\n");
//
//	//占位符%d
//	printf("%dabc\n", 100);
//
//	//%s ：字符串
//	printf("%s will come tonight\n", "zhangsan");
//
//	//当对应参数不全时，系统会自动随机匹配
//	printf("%s says it is %d o'clock\n", "lisi");
//	printf("%s says it is %d o'clock\n", "cuihua", 21);
//
//	//% a ：⼗六进制浮点数，字⺟输出为⼩写。
//	//% A ：⼗六进制浮点数，字⺟输出为⼤写。
//	//% c ：字符。
//	//% d ：⼗进制整数。// int
//	//%f ：⼩数（包含 float 类型和 double 类型）。//float %f   double - %lf
//	//%hd ：⼗进制 short int 类型
//	//%n ：已输出的字符串数量。该占位符本⾝不输出，只将值存储在指定变量之中。
//	//%p ：指针（⽤来打印地址）。
//	// %s ：字符串。
//	//%u ：⽆符号整数（unsigned int）。
//	//%zd ： size_t 类型
//
//
//	//% ho ：⼋进制 short int 类型。
//	//% hx ：⼗六进制 short int 类型。
//	printf("%ho\n", 100);
//	printf("%hd\n", 100);
//
//
//	//printf() 允许限定占位符的最⼩宽度。
//	
//	printf("%5d\n", 123); // 输出为 " 123"
//	printf("%-5d\n", 123); // 输出为 "123  "
//
//	//%f  %lf   在打印的时候，小数点后默认是打印6位小数
//	printf("%lf\n", 123.45);
//	printf("%12lf\n", 123.45);//可以指定小数的位数  "      123.45"
//	printf("%-12lf\n", 123.45);//可以指定小数的位数  "123.45      "
//
//
//	//默认情况下， printf() 不对正数显⽰ + 号，只对负数显⽰ - 号。
//	//如果想让正数也输出 + 号，可以在占位符的 % 后⾯加⼀个 +
//
//	printf("%+d\n", 12); // 输出 +12
//	printf("%+d\n", -12);//输出 -12
//
//
//	//输出⼩数时，有时希望限定⼩数的位数。
//	//举例来说，希望⼩数点后⾯只保留两位，占位符可以写成 % .2f
//	printf("Number is %.2f\n", 0.5);
//	printf("Number is %.3f\n", 0.5);
//
//	//% 6.2f 表⽰输出字符串最⼩宽度为6，⼩数位数为2。所以，输出字符串的头部有两个空格
//	printf("%6.2f\n", 0.5);
//
//
//	//最⼩宽度和⼩数位数这两个限定值，都可以⽤ * 代替，通过 printf() 的参数传⼊
//	printf("%*.*f\n", 6, 2, 0.5);
//
//
//	//% s 占位符⽤来输出字符串，默认是全部输出。
//	printf("%s\n", "abcdef");
//	
//	//如果只想输出开头的部分，可以⽤% .[m]s 指定输出的⻓度，其中[m] 代表⼀个数字，表⽰所要输出的⻓度。
//	printf("%.3s\n", "abcdef");
//	printf("%.5s\n", "hello world");
//	
//	return 0;
//}


//int main()
//{
//	//int score = 0;
//	//scanf("%d", &score);//占位符的后面需要的是地址，& - 取地址操作符
//	//printf("请输入成绩：%d\n", score);
//
//	/*int a = 0;
//	int b = 0;
//	float f1 = 0.0;
//	float f2 = 0.0;
//	scanf("%d %d %f %f", &a, &b, &f1, &f2);
//	printf("%d %d %f %d", a, b, f1, f2);*/
//
//
//	//scanf() 处理数值占位符时，会⾃动过滤空⽩字符，包括空格、制表符、换⾏符等。
//	//所以，⽤户输⼊的数据之间，有⼀个或多个空格不影响 scanf() 解读数据。
//	//另外，⽤户使⽤回⻋键，将输⼊分成⼏⾏，也不影响解读
//	int x;
//	float y;
//
//	// ⽤⼾输⼊ " -13.45e12# 0"
//	//.45e12 - 0.45*10的12次方
//	//scanf("%d %f", &x, &y);
//	//printf("%d %f\n", x, y);//-13
//	//scanf("%f", &y);
//	//printf("%f\n", y);
//
//	return 0;
//}


////scanf的返回值
////如果没有读取任何项，或者匹配失败，则返回 0 。
////如果在成功读取任何数据之前，发⽣了读取错误或者遇到读取到⽂件结尾，则返回常量 EOF(-1)。
////EOF - end of file ⽂件结束标志
//int main()
//{
//	int a = 0;
//	int b = 0;
//	int c = 0;
//	int d = 0;
//	int ret = scanf("%d %d %d %d", &a, &b, &c, &d);
//	printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
//	printf("ret = %d\n", ret);//返回值
//
//	return 0;
//}




//% c 不忽略空⽩字符，总是返回当前第⼀个字符，⽆论该字符是否为空格。
//如果要强制跳过字符前的空⽩字符，可以写成 scanf(" %c", &ch) ，即% c 前加上⼀个空格，表⽰跳过零个或多个空⽩字符。
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);//%d会主动跳过前面的空格
//	printf("%d\n", num);
//
//	return 0;
//}


//int main()
//{
//	char ch = 0;
//	scanf(" %c", &ch);//%c前面加上空格，则会跳过前面的空格，读取后面的字符
//	printf("xxxxx%cyyyyy\n", ch);
//
//	return 0;
//}




////%s：它的规则是，从当前第⼀个⾮空⽩字符开始读起，直到遇到空⽩字符（即空格、换⾏符、制表符等）为⽌。
////scanf() 将字符串读⼊字符数组时，不会检测字符串是否超过了数组⻓度。
////所以，储存字符串时，很可能会超过数组的边界，导致预想不到的结果。
////为了防⽌这种情况，使⽤% s 占位符时，应该指定读⼊字符串的最⻓⻓度，
////即写成% [m]s ，其中的[m] 是⼀个整数，表⽰读取字符串的最⼤⻓度，后⾯的字符将被丢弃。
//int main()
//{
//
//	char arr[5] = { 0 };
//	scanf("%4s", arr);//数组名是地址，所以不需要取地址
//	printf("%s\n", arr);
//
//	return 0;
//}


////赋值忽略符
////赋值忽略符（assignment suppression character）* 。
////只要把* 加在任何占位符的百分号后⾯，该占位符就不会返回值，解析后将被丢弃。
//int main()
//{
//	int year = 0;
//	int month = 0;
//	int day = 0;
//	scanf("%d%*c%d%*c%d", &year, &month, &day);
//	printf("%d %d %d", year, month, day);
//
//	return 0;
//}

//在创建变量的时候，给变量一个初始值，是一种好的编程习惯，如果不给变量初始化，有的编译器会报错
//局部变量不初始化的时候，它的值是随机的
//全局变量如果不初始化，默认值是0

//#include <stdio.h>
//
//int a;
//int main()
//{
//	int a = 0;
//	printf("%d\n", a);
//	return 0;
//}





//第二讲：C语言数据类型和变量
//分支和循环
//在C语⾔中，0为假，非0表⽰真
//int main()
//{
//	int num = 10;
//	if (num)
//		printf("hehe\n");
//
//	return 0;
//}


////输入一个整数，判断是否为奇数
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	if (num % 2 == 1)
//		printf("这个数为奇数\n");
//	else
//		printf("这个数是偶数\n");
//
//	return 0;
//}

//
////输入一个年龄，>=18岁就输出成年，否则输出未成年
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age >= 18)
//	{
//		printf("成年\n");
//		printf("可以谈恋爱了\n");
//	}
//		
//	else
//	{
//		printf("未成年\n");
//		printf("好好学习吧\n");
//	}
//		
//	return 0;
//}



//嵌套if
////方法一
//int main()
//{
//	int  num = 0;
//	scanf("%d", &num);
//	if (num == 0)
//		printf("输入的值是0\n");
//	else
//	{
//		if (num > 0)
//			printf("输入的值是正数\n");
//		else
//			printf("输入的值是负数\n");
//	}
//
//	return 0;
//}


////方法二
//int main()
//{
//	int  num = 0;
//	scanf("%d", &num);
//	if (num >= 0)
//	{
//		if(num==0)
//			printf("输入的值是0\n");
//		else
//			printf("输入的值是正数\n");
//	}
//			
//	else
//		printf("输入的值是负数\n");
//	
//
//	return 0;
//}



////方法三
//int main()
//{
//	int  num = 0;
//	scanf("%d", &num);
//	if (num == 0)
//		printf("输入的值是0\n");
//	else if (num > 0)
//		printf("输入的值是正数\n");
//	else
//		printf("输入的值是负数\n");
//
//	return 0;
//}



//输⼊⼀个⼈的年龄
//如果年龄 < 18岁，打印"少年"
//如果年龄在18岁⾄44岁打印"⻘年"
//如果年龄在45岁⾄59岁打印"中⽼年"
//如果年龄在60岁⾄89岁打印"⽼年"
//如果90岁及以上打印"⽼寿星"

//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age <= 18)
//		printf("少年\n");
//	else if (age > 18 && age <= 44)
//		printf("青年\n");
//	else if (age >= 45 && age <= 59)
//		printf("中老年\n");
//	else if (age >= 60 && age <= 89)
//		printf("老年\n");
//	else
//		printf("老寿星\n");
//
//	return 0;
//}


//悬空else问题
//如果有多个 if 和 else ，可以记住这样⼀条规则， else 总是跟最接近的 if 匹配。
//int main()
//{
//	int a = 0;
//	int b = 2;
//	if (a == 1)
//		if (b == 2)
//			printf("hehe\n");
//	else
//		printf("haha\n");
//
//	return 0;
//}//没有输出结果


//如果让else和第一个if匹配则可以加上大括号
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
			printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}